Cloud Scheduler での HTTP リクエストのタイムアウトを調査してみた

Cloud Scheduler での HTTP リクエストのタイムアウトを調査してみた

Clock Icon2024.10.07

Google Cloud データエンジニアのはんざわです。
前回のブログで、Cloud Scheduler の HTTP ターゲットで Cloud Run functions を呼び出す方法を紹介しました。

https://dev.classmethod.jp/articles/gcp-cloud-scheduler-http-target/

ご存知の方も多いと思いますが、Cloud Run functions の最大タイムアウト時間は、HTTP 関数で 60 分(3600 秒)です。
そこで、Cloud Scheduler の HTTP リクエストでも同様に 60 分の実行が可能かどうか、気になったため、調査してみました。
本ブログでは、その調査結果を紹介したいと思います。

https://cloud.google.com/functions/docs/configuring/timeout?hl=ja

結論

https://cloud.google.com/scheduler/quotas?hl=ja

結論から言うと、Cloud Scheduler が HTTP リクエストの完了を待つことができる時間は最大で 30 分です。
この時間を超えた場合、リクエストはタイムアウトとなり、設定した再試行のポリシーに従って再試行されます。

タイムアウトは、デフォルトで 3 分に設定されています。

コンソールからだと、オプションの設定を行う -> 試行期限の構成 から設定が可能です。
以下のキャプチャのとおり、30 分を超えた値は設定できません。

スクリーンショット 2024-10-07 16.32.53

コマンドラインからだと、--attempt-deadline の引数で設定が可能です。
同様に、30 分を超えた値は設定できません。

$ gcloud scheduler jobs create http test \
    --attempt-deadline '40m' \
    --schedule '0 1 * * *' \
    --uri 'https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function'

> (gcloud.scheduler.jobs.create.http) INVALID_ARGUMENT: Job.attemptDeadline must be between [15s, 30m].
  • 参考

https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/create/http

試してみる

ここからは、許容時間を超えた場合にどのような挙動をするのか、またどのようなログが出力されるのかを実際に確認してみたいと思います。

事前準備

全体の構成は、前回のブログと同じです。

https://dev.classmethod.jp/articles/gcp-cloud-scheduler-http-target/

設定内容が異なる点だけ簡単に紹介します。

Cloud Run functions の準備

  • タイムアウト:3600 秒
  • ソースコードは以下のとおりで、1 分毎に経過時間を出力し、10 分後に完了します
import time
import functions_framework

@functions_framework.http
def hello_http(request):
    print('Function Started')

    min = 0
    for _ in range(10):
        time.sleep(60)
        min += 1
        print(f'{min}分が経過しました。')

    print('Function Finished')

    return 'OK'

Cloud Scheduler の準備

今回の検証では、タイムアウトを 5 分(300 秒)にします。
(タイムアウトを超えた時の挙動やログを確認したいので、短めの時間にしています。)

以下のコマンドで、Cloud Scheduler を作成します。

Cloud Scheduler を作成するコマンド
gcloud scheduler jobs create http exec-cloud-run-function-no-retry \
  --attempt-deadline '5m' \
  --location 'asia-northeast1' \
  --schedule '0 0 1 * *' \
  --uri 'https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function' \
  --headers 'content-type=application/json' \
  --http-method 'POST' \
  --time-zone 'Asia/Tokyo' \
  --oidc-service-account-email='sa-call-function@<PROJECT_ID>.iam.gserviceaccount.com'

実行してみる

早速、Cloud Scheduler を手動で実行し、挙動を確認してみたいと思います。

実行後の Cloud Scheduler のログは、以下のとおりです。

# 重大度:INFO
# 時間:2024-10-07 18:36:25.607
{
  "@type":"type.googleapis.com/google.cloud.scheduler.logging.AttemptStarted",
  "jobName":"projects/<PROJECT_ID>/locations/asia-northeast1/jobs/exec-cloud-run-function-no-retry",
  "scheduledTime":"2024-10-31T15:00:00.799467Z", 
  "targetType":"HTTP",
  "url":"https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function"
}

# 重大度:ERROR
# 時間:2024-10-07 18:41:30.781
{
  "@type":"type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished",
  "debugInfo":"URL_TIMEOUT-TIMEOUT_WEB. Original HTTP response code number = 504",
  "jobName":"projects/<PROJECT_ID>/locations/asia-northeast1/jobs/exec-cloud-run-function-no-retry",
  "status":"DEADLINE_EXCEEDED",
  "targetType":"HTTP",
  "url":"https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function"
}

実行開始から 5 分後にエラーログが流れていることがわかると思います。
エラーログ内容も 504 エラーや DEADLINE_EXCEEDED など上限の時間を超えたことが分かるログが見受けられます。

続いて、Cloud Run functions のログも確認してみます。

スクリーンショット 2024-10-07 19.09.20

残念ながら 5 分経っても Cloud Run functions の処理は止まりません。

Cloud Scheduler のタイムアウトが Cloud Run functions よりも短い場合、Cloud Run functions 側では処理が継続しているにも関わらず、Cloud Scheduler 側ではエラーと認識されてしまう可能性があります。
この問題を回避するため、Cloud Scheduler のタイムアウトと、Cloud Run functions のタイムアウトを一致させる必要があります。

まとめ

今回のブログでは、Cloud Scheduler における HTTP リクエストのタイムアウトを調査した結果を紹介しました。

Cloud Scheduler のタイムアウト上限は 30 分であり、この時間内にリクエストが完了しない場合はタイムアウトエラーとなります。
HTTP ターゲットの Cloud Scheduler と Cloud Run functions を利用する際は、今回の内容を踏まえて、適切なタイムアウトを設定することが重要です。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.